/**
 * toast 提示
 */
export const msg = (title = '', param = {}) => {
	if (!title) return;
	uni.showToast({
		title,
		duration: param.duration || 1500,
		mask: param.mask || false,
		icon: param.icon || 'none'
	});
}
export const loading = (title = '', params = {}) => {
	if (!title) return;
	uni.showLoading({
		title,
		mask: true
	})
}
/* 
将对象属性转为'' 
 */
export const objClear = (query = {}) => {
	// 将对象转为数组，判断他的长度是否为0
	if (Object.keys(query).length == 0) {
		return
	}
	Object.keys(query).forEach(key => {
		query[key] = ''
	})
}
/* 
 跳转
 */
export const navTo = (url, options = {login:'',type:'naTo'}) => {
	if (!url) return
	// let hasLogin = store.getters.hasLogin
	// if (options.login == 'login' && !hasLogin && url!=='/pages/login/index') {
	// 	uni.navigateTo({
	// 		url: '/pages/login/index'
	// 	})
	// 	return
	// }
	// 关闭所有页面，打开到应用内的某个页面。
	if (options.type == 'reCh') {
		uni.reLaunch({
			url: url
		})
		// 保留当前页面，跳转到应用内的某个页面
	} else if (options.type == 'naTo') {
		uni.navigateTo({
			url
		})
		// 关闭当前页面，跳转到应用内的某个页面。
	} else if (options.type == 'reTo'){
		uni.redirectTo({
			url,
		})
		// 跳转到 tabBar 页面，并关闭其他所有非 tabBar 页面
	}else if(options.type=='tab'){
		uni.switchTab({
			url,
			fail: (err) => {
				console.log(err)
			}
		})
	}else if(options.type=='back'){
		uni.navigateBack({
			delta:1
		})
	}
}
/**
 * 检查登录
 * @return {Boolean}
 */
export const isLogin = (options = {}) => {
	const token = uni.getStorageSync('');
	if (token) { // 加上!先暂时表示已经登录
		return true;
	}
	// options.nav只要传的不是 false，默认跳转到登录页
	if (options.nav !== false) {
		// console.log('options.nav', options.nav)
		uni.navigateTo({
			url: '/pages/auth/login'
		})
	}
	return false;
}

// 节流，是否正在运行，防止多次请求
let _throttleRunning = false
/**
 * 节流
 * @param {Function} 执行函数
 * @param {Number} delay 延时ms  
 */
export const throttle = (fn, delay = 500) => {
	// 正在运行，这次结束
	if (_throttleRunning) {
		return;
	}
	//标识正在运行
	_throttleRunning = true;
	// 延时delay毫秒后运行，结束后标识运行结束
	setTimeout(() => {
		fn();
		_throttleRunning = false;
	}, delay);
}

/**
 * 获取当前页面的路由地址+参数
 */
export const routePath = () => {
	// 获取所有页面对象
	const pages = getCurrentPages();
	// 获取当前页面实例
	const page = pages[pages.length - 1];

	// 当前路由参数对象 {id: 2, name: 'xx'}
	// 在小程序或app中，使用 page.options ; H5端使用 page.$route.query
	const query = page.options || page.$route.query;
	// 将参数对象转换为 key1=value1&key2=value2形式
	let queryStr = '';
	query && Object.keys(query).forEach((key) => {
		queryStr += `${key}=${query[key]}`
	});
	// 当前路由地址+参数 pages/course/course-details.vue?key1=value1&key2=value2
	return queryStr ? `${page.route}?${queryStr}` : page.route;
}

/**
 * 校验格式数据格式
 * @param 要校验的数据
 * @param 什么类型格式
 */
export const checkStr = (str, type) => {
	switch (type) {
		case 'mobile': //手机号码
			return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
		case 'tel': //座机
			return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
		case 'card': //身份证
			return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
		case 'mobileCode': //6位数字验证码
			return /^[0-9]{6}$/.test(str)
		case 'pwd': //密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
			return /^([a-zA-Z0-9_]){6,18}$/.test(str)
		case 'payPwd': //支付密码 6位纯数字
			return /^[0-9]{6}$/.test(str)
		case 'postal': //邮政编码
			return /[1-9]\d{5}(?!\d)/.test(str);
		case 'QQ': //QQ号
			return /^[1-9][0-9]{4,9}$/.test(str);
		case 'weixin': //微信号
			return /^[a-zA-Z][a-zA-Z\d_-]{5,19}$/.test(str);
		case 'email': //邮箱
			return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
		case 'money': //金额(小数点2位)
			return /^\d*(?:\.\d{0,2})?$/.test(str);
		case 'URL': //网址
			return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
		case 'IP': //IP
			return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
		case 'date': //日期时间
			return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) ||
				/^(\d{4})\-(\d{2})\-(\d{2})$/
				.test(str)
		case 'number': //数字
			return /^[0-9]$/.test(str);
		case 'english': //英文
			return /^[a-zA-Z]+$/.test(str);
		case 'chinese': //中文
			return /^[\\u4E00-\\u9FA5]+$/.test(str);
		case 'lower': //小写
			return /^[a-z]+$/.test(str);
		case 'upper': //大写
			return /^[A-Z]+$/.test(str);
		case 'HTML': //HTML标记
			return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
		default:
			return true;
	}
}

/**
 * @desc 格式化日期字符串
 * @param { Nubmer} - Date日期 , 时间不能大于当前时间，大于当前时间会返回“刚刚”。
 * @returns { String } 格式化后的日期字符串
     // 2012年01月10日 12:46
     //刚刚
    //16分钟前
    //今天10:10
    //昨天10:10
    //02月10日 10:10:11
    //2012年10月10日 10:10:11
 */
export const dateFormat = (date) => {
	if (!date) return ''
	//new Date 在 ios safari浏览器有兼容性问题处理如下：ios不支持2027-2-22 16:23，需要改为2027/2/22 16:23 
	// ? 兼容 ios safari : 兼容其他浏览器
	let $this = new Date(date) == 'Invalid Date' ? new Date(date.replace(/-/g, "/")) : new Date(date)
	var timestamp = parseInt(Date.parse($this)) / 1000 //- 8 * 60 * 60; //（本地时间）东八区减去8小时;

	function zeroize(num) {
		return (String(num).length == 1 ? '0' : '') + num;
	}
	var curTimestamp = parseInt(new Date().getTime() / 1000); //当前时间戳
	var timestampDiff = curTimestamp - timestamp; // 参数时间戳与当前时间戳相差秒数
	var curDate = new Date(curTimestamp * 1000); // 当前时间日期对象
	var tmDate = new Date(timestamp * 1000); // 参数时间戳转换成的日期对象

	var Y = tmDate.getFullYear(),
		m = tmDate.getMonth() + 1,
		d = tmDate.getDate();
	var H = tmDate.getHours(),
		i = tmDate.getMinutes(),
		s = tmDate.getSeconds();


	if (timestampDiff < 60) { // 一分钟以内
		return "刚刚";
	} else if (timestampDiff < 3600) { // 一小时前之内
		return Math.floor(timestampDiff / 60) + "分钟前";
	} else if (curDate.getFullYear() == Y && curDate.getMonth() + 1 == m && curDate.getDate() == d) {
		return '今天 ' + zeroize(H) + ':' + zeroize(i) + ':' + zeroize(s);
	} else {
		var newDate = new Date((curTimestamp - 86400) * 1000); // 参数中的时间戳加一天转换成的日期对象
		if (newDate.getFullYear() == Y && newDate.getMonth() + 1 == m && newDate.getDate() == d) {
			return '昨天 ' + zeroize(H) + ':' + zeroize(i) + ':' + zeroize(s);
		} else if (curDate.getFullYear() == Y) {
			// return  zeroize(m) + '月' + zeroize(d) + '日 ' + zeroize(H) + ':' + zeroize(i) + ':' + zeroize(s);
			return zeroize(m) + '月' + zeroize(d) + '日';
		} else {
			// return  Y + '年' + zeroize(m) + '月' + zeroize(d) + '日 ' + zeroize(H) + ':' + zeroize(i) + ':' + zeroize(s);
			return Y + '年' + zeroize(m) + '月' + zeroize(d) + '日';
		}
	}
}
/**
 * @param {format} 转换后的日期格式，默认yyyy-MM-dd hh:mm:ss
 */
export function format(date, format = "yyyy-MM-dd hh:mm:ss") {
	if (!date) return ''
	//new Date 在 ios safari浏览器有兼容性问题处理如下：
	// ? 兼容safari : 兼容其他浏览器
	let $this = new Date(date) == 'Invalid Date' ? new Date(date.substr(0, 19)) : new Date(date)

	let o = {
		'M+': $this.getMonth() + 1,
		'd+': $this.getDate(),
		'h+': $this.getHours(),
		'm+': $this.getMinutes(),
		's+': $this.getSeconds(),
		'q+': Math.floor(($this.getMonth() + 3) / 3),
		'S': $this.getMilliseconds()
	}
	if (/(y+)/.test(format)) {
		format = format.replace(RegExp.$1, ($this.getFullYear() + '').substr(4 - RegExp.$1.length))
	}
	for (var k in o) {
		if (new RegExp('(' + k + ')').test(format)) {
			format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k])
				.length)))
		}
	}
	return format
}
// 计算年龄
export function ages(str) {
	if(!str)return '未知'
	var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
	if (r == null) return false;
	var d = new Date(r[1], r[3] - 1, r[4]);
	if (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]) {
		var Y = new Date().getFullYear();
		return (Y - r[1]);
	}
	return ("输入的日期格式错误！");
}


/* 查看app是否开启了权限 */
export function checkPermission(permissionID) {
	return new Promise((resolve, reject) => {
		let result = 0
		if (plus.os.name == 'Android') {
			/* 查看安卓权限 */
			plus.android.checkPermission(`android.permission.${permissionID}`,
				granted => {
					if (granted.checkResult == 0) {
						result = 1
					} else {
						result = 0
					}
					resolve(result);
				},
				error => {
					console.log(error.message);
				}
			);
		} else {
			//IOS不需要添加自定义弹框来描述权限目的，因为在配置文件的隐私信息访问的许可描述里可添加
			//正常可以直接调用uni的API调起权限询问弹框使用各种权限，下面的判断使用场景主要是在IOS禁用某权限后，这个可以判断有无权限，进而引导用户跳转设置开启，仅列出了位置、相册、通讯录、相机、录音等权限，其他IOS权限可具体参考 https://ext.dcloud.net.cn/plugin?id=15787
			//IOS检测相机/摄像头权限
			if (permissionID == 'ACCESS_FINE_LOCATION') {
				//IOS检测位置权限
				let iosFirsManager=uni.getStorageSync('iosFirsManager')
				let cLLocationManager = plus.ios.import("CLLocationManager"),
					authStatus = cLLocationManager.authorizationStatus(),
					enable = cLLocationManager.locationServicesEnabled();
				if(!iosFirsManager){
					result = 1;
				}else{
					if (enable && authStatus != 2) {
						uni.setStorageSync('iosFirsManager',true)
						result = 1;
					} else {
						result = 0;
					}
				}
				plus.ios.deleteObject(cLLocationManager);
			} else if (permissionID == 'WRITE_EXTERNAL_STORAGE') {
				/* 判断是否打开过，如果打开过则走正常的权限打开流程，否则直接让其通过 */
				let iosFirstWrite=uni.getStorageSync('iosFirstWrite')
				//IOS检测相册权限
				let PHPhotoLibrary = plus.ios.import("PHPhotoLibrary"),
					authStatus = PHPhotoLibrary.authorizationStatus();
					
				if(!iosFirstWrite){
					result = 1;
				}else{
					if (authStatus === 3) {
						uni.setStorageSync('iosFirstWrite',true)
						result = 1;
					} else {
						result = 0;
					}
				}
				plus.ios.deleteObject(PHPhotoLibrary);
			} else if (permissionID == 'CAMERA') {
				/* 判断是否打开过，如果打开过则走正常的权限打开流程，否则直接让其通过 */
				let iosFirstCamera=uni.getStorageSync('iosFirstCamera')
				//IOS检测相机/摄像头权限
				let avCaptureDevice = plus.ios.import("AVCaptureDevice"),
					authStatus = avCaptureDevice.authorizationStatusForMediaType("vide");
				if(!iosFirstCamera){
					result = 1;
				}else{
					if (authStatus === 3) {
						uni.setStorageSync('iosFirstCamera',true)
						result = 1;
					} else {
						result = 0;
					}
				}
				plus.ios.deleteObject(avCaptureDevice);
			} else if (permissionID == 'CALL_PHONE') {
				//IOS检测通讯录权限
				let iosFirstStore=uni.getStorageSync('iosFirstStore')
				let contactStore = plus.ios.import("CNContactStore"),
					authStatus = contactStore.authorizationStatusForEntityType(0);
				if(!iosFirstStore){
					result = 1;
				}else{
					if (authStatus === 3) {
						uni.setStorageSync('iosFirstStore',true)
						result = 1;
					} else {
						result = 0;
					}
				}
				plus.ios.deleteObject(contactStore);
			} else if (permissionID == 'RECORD_AUDIO') {
				//IOS检测麦克风权限
				let iosFirstAVAudio=uni.getStorageSync('iosFirstAVAudio')
				let aVAudioSession = plus.ios.import("AVAudioSession"),
					aVAudio = aVAudioSession.sharedInstance(),
					authStatus = aVAudio.recordPermission();
				if(!iosFirstAVAudio){
					result = 1;
				}else{
					if ([1684369017, 1970168948].includes(authStatus)) {
						result = 0;
					} else {
						result = 1;
					}
				}
				plus.ios.deleteObject(aVAudioSession);
			}
			resolve(result);
		}
	});
}
//打开手机某一项权限
export function requestPermissions(permissionID) {
	return new Promise((resolve, reject) => {
		plus.android.requestPermissions([`android.permission.${permissionID}`],
			(e) => {
				if (e.granted.length > 0) {
					resolve()
				}
				if (e.deniedAlways.length > 0) {
					reject()
				}
			})
	});
}
//打开手机权限设置页面
export function gotoAppPermissionSetting() {
	var isIos
	// #ifdef APP-PLUS
	isIos = (plus.os.name == "iOS")
	// #endif
	if (isIos) {
		var UIApplication = plus.ios.import("UIApplication");
		var application2 = UIApplication.sharedApplication();
		var NSURL2 = plus.ios.import("NSURL");
		// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");		
		var setting2 = NSURL2.URLWithString("app-settings:");
		application2.openURL(setting2);

		plus.ios.deleteObject(setting2);
		plus.ios.deleteObject(NSURL2);
		plus.ios.deleteObject(application2);
	} else {
		// console.log(plus.device.vendor);
		var Intent = plus.android.importClass("android.content.Intent");
		var Settings = plus.android.importClass("android.provider.Settings");
		var Uri = plus.android.importClass("android.net.Uri");
		var mainActivity = plus.android.runtimeMainActivity();
		var intent = new Intent();
		intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
		var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
		intent.setData(uri);
		mainActivity.startActivity(intent);
	}
}
/**
 * 获取购物车商品总数量
 * @param {*} value 
 */
export const getCartTotalNum = (value) => {
	const cartTotal = uni.getStorageSync('cartTotalNum') || 0
	return checkLogin() ? cartTotal : 0
}

/**
 * 记录购物车商品总数量
 * @param {*} value 
 */
export const setCartTotalNum = (value) => {
	uni.setStorageSync('cartTotalNum', Number(value))
}

/**
 * 设置购物车tabbar的角标
 * 该方法只能在tabbar页面中调用, 其他页面调用会报错
 */
export const setCartTabBadge = () => {
	const cartTabbarIndex = 2
	const cartTotal = getCartTotalNum()
	if (cartTotal > 0) {
		uni.setTabBarBadge({
			index: cartTabbarIndex,
			text: `${cartTotal}`
		})
	} else {
		uni.removeTabBarBadge({
			index: cartTabbarIndex
		})
	}
	return
}